package com.example.aigc_education.utils;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.example.aigc_education.common.BusinessException;
import com.example.aigc_education.config.CaptchaConfig;
import com.example.aigc_education.constant.CacheConstants;
import com.example.aigc_education.constant.Constants;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Component
public class SmsUtils {

    @Value("${aliyun.sms.region_id}")
    private String regionId;

    // 通过注入方式获取阿里云短信服务的Access Key ID
    @Value("${aliyun.sms.access_key_id}")
    private String accessKeyId;

    // 通过注入方式获取阿里云短信服务的Access Key Secret
    @Value("${aliyun.sms.secret}")
    private String secret;

    @Resource
    private RedisCache redisCache;

    /**
     * 短信发送模板
     * 用于发送短信到指定手机号。该功能依赖于阿里云短信服务。
     *
     * @param validateCode 验证码。
     * @param phone 发送短信的目标手机号码。
     * @return 返回一个布尔值，表示短信是否发送成功。true表示成功，false表示失败。
     * @throws BusinessException 如果手机号为空，抛出此异常。
     */
    public Boolean sendMessage(String validateCode, String phone) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", validateCode);
        // 检查手机号是否为空
        if (StringUtils.isAnyBlank(phone)) {
            throw new BusinessException("手机号码不能为空");
        }

        // 初始化阿里云短信服务客户端
        DefaultProfile profile =
                DefaultProfile.getProfile(regionId, accessKeyId, secret);
        IAcsClient client = new DefaultAcsClient(profile);

        // 设置发送短信的请求参数
        SendSmsRequest request = new SendSmsRequest();
        request.setSignName("星火教育"); // 设置短信签名
        request.setTemplateCode("SMS_467135302"); // 设置短信模板code
        request.setPhoneNumbers(phone); // 设置目标手机号码
        request.setTemplateParam(JSONObject.toJSONString(map)); // 设置发送的短信内容

        try {
            // 发送短信并处理响应
            SendSmsResponse response = client.getAcsResponse(request);
            redisCache.setCacheObject(getSmsKey(phone), validateCode, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
            // 判断短信是否发送成功
            return response.getMessage().equals("OK"); // 短信发送成功时Message信息为OK
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        // 如果捕获到异常或未明确判断发送成功，则返回失败
        return false;
    }

    /**
     * 获取验证码
     * @param phone 电话key
     * @return
     */
    private String get(String phone){
        String key = getSmsKey(phone);
        Object code = redisCache.getCacheObject(key);
        if (code != null) {
            return code.toString();
        }
        return null;
    }

    /**
     * 删除验证码
     * @param phone
     */
    public void delete(String phone){
        String key = getSmsKey(phone);
        redisCache.deleteObject(key);
    }

    /**
     * 验证码校验
     * @param phoneNumber
     * @param code
     * @return
     */
    public boolean check(String phoneNumber, String code){
        String verification = this.get(phoneNumber);
        if(verification == null){
            return false;
        }
        if (verification.equals(code)){
            this.delete(phoneNumber);
            return true;
        }
        return false;
    }

    /**
     * 获取Key
     * @param phone
     * @return
     */
    private String getSmsKey(String phone){
        return CacheConstants.SMS_CODE_KEY + phone;
    }

//    /**
//     * 更新验证码内容
//     */
//    public void updateMobileCode(String phone, String newValidateCode){
//        delete(phone);
//        redisCache.setCacheObject(getSmsKey(phone), newValidateCode, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
//    }

}
